IsNumeric?

Otázka od: Dalibor Faltynek

7. 10. 2004 8:45

Ahoj,
nejak jsem se zasekl na trivialnim problemku: Jak zjistit, jestli hodnota v
databazove polozce datasetu BDE typu text je cislo nebo ne. Samozrejme ze to
jde pres nejakou konstrukci try except, nebo funkci VAL, ale neni jednodussi
zpusob, treba jako dotaz typ IsNumeric, jako je to ve VB? Pouzivam Delphi5
Enterprise.

Diky Dalibor.


Odpovedá: Ondrej Kelle

7. 10. 2004 9:48

> nejak jsem se zasekl na trivialnim problemku: Jak zjistit,
> jestli hodnota v databazove polozce datasetu BDE typu text
> je cislo nebo ne.
> Samozrejme ze to jde pres nejakou konstrukci try except,
> nebo funkci VAL, ale neni jednodussi zpusob, treba jako
> dotaz typ IsNumeric, jako je to ve VB?
> Pouzivam Delphi5 Enterprise.

V Delphi 7 je TryStrToInt. Nespominam si, ci bola uz v Delphi 5.
Ak nie, potom funkcia IsNumeric by mohla vyzerat napriklad takto:

function IsNumeric(const S: string): Boolean;
var
  I: Integer;
begin
  Result := False;
  if S = '' then
    Exit;
  for I := 1 to Length(S) do
    if not (S[I] in ['0'..'9']) then
      Exit;
  Result := True;
end;

Nemam to odskusane, pisal som to priamo do mailu.

HTH
TOndrej


Odpovedá: Dalibor Faltynek

7. 10. 2004 10:42

Asi bude fakt nejjednodussi to otestovat pres fci VAL. Musis ale vedet,
jestli to ma byt integer nebo float a pro jistotu vypnout $R a po testu yase
yapnout.

procedure Val(S; var V; var Code: Integer);
pri nenulovem Code jde o cislo, jinak je to text.

Dalibor.


Odpovedá: Petr Brant

7. 10. 2004 10:21

Funkce IsNum nebo snad IsNumber je v JCL, myslim ze v unite JCLStrings,
zjistuje se, jestli je kazdy znak cislo.

RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz <http://brant.wz.cz>


> nejak jsem se zasekl na trivialnim problemku: Jak zjistit, jestli hodnota
> v
> databazove polozce datasetu BDE typu text je cislo nebo ne. Samozrejme ze
> to
> jde pres nejakou konstrukci try except, nebo funkci VAL, ale neni
> jednodussi
> zpusob, treba jako dotaz typ IsNumeric, jako je to ve VB? Pouzivam
> Delphi5
> Enterprise.
>


Odpovedá: Petr Brant

7. 10. 2004 11:07

Jo, ale davej pritom bacha na jednu vec: Nejsem si jist, jestli tahle funkce
nevyzaduje pro pripad float hodnoty natvrdo desetinnou tecku namisto
systemoveho oddelovace. Myslim, ze s tim byly nejake potize, ale radsi to
over, bohuzel se ted nemohu podivat.

RNDr. Petr Brant [brant@dcomm.cz]
http://brant.wz.cz <http://brant.wz.cz>


> Asi bude fakt nejjednodussi to otestovat pres fci VAL. Musis ale vedet,
> jestli to ma byt integer nebo float a pro jistotu vypnout $R a po testu
> yase
> yapnout.
>
> procedure Val(S; var V; var Code: Integer);
> pri nenulovem Code jde o cislo, jinak je to text.
>


Odpovedá: Dalibor Faltynek

8. 10. 2004 10:18

Mas pravdu, vzpominam si na to, u floatu se to muselo testovat, ale v
pripade integeru by nemel byt problem. A tam ja to potrebuju. Samozrejme ta
procedurku, kterou jsi uvedl taky neni problem zaradit do programu a je
univerzalni. Nevim jak rychlost pri velkem poctu testovanych cisel.

Diky za rady Dalibor.

> Jo, ale davej pritom bacha na jednu vec: Nejsem si jist, jestli tahle
funkce
> nevyzaduje pro pripad float hodnoty natvrdo desetinnou tecku namisto
> systemoveho oddelovace. Myslim, ze s tim byly nejake potize, ale radsi to
> over, bohuzel se ted nemohu podivat.
>


Odpovedá: Vlastimil Burian

14. 10. 2004 13:26

pokud sem si vsiml v predchozich prispevcich tak mas Delphi 5 ... ted u sebe
nemam delphi ale v petkach jiz lze pouzit varianty ... samozrejme zalezi na
konkretnim pouziti takze se to treba hodit nemusi ... melo by to byt nejak
takto ...

var
  prom: Variant;

begin

  prom := Edit1.Text;
  if GetVarType(prom) = varInteger then ......

end;


> Mas pravdu, vzpominam si na to, u floatu se to muselo testovat, ale v
> pripade integeru by nemel byt problem. A tam ja to potrebuju. Samozrejme
ta
> procedurku, kterou jsi uvedl taky neni problem zaradit do programu a je
> univerzalni. Nevim jak rychlost pri velkem poctu testovanych cisel.